package com.yanxu.spin;

import java.sql.SQLOutput;
import java.util.concurrent.atomic.AtomicReference;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2025/3/23-2025
 * @Description: 自己实现一个  自旋锁
 */
public class SpinLock {
    AtomicReference<Thread> sign = new AtomicReference<>();

    public void lock() {
        Thread thread = Thread.currentThread();
        while (!sign.compareAndSet(null, thread)) {
            System.out.println(Thread.currentThread().getName()+" 自旋获取失败，再次尝试！");
        }
    }

    public void unlock() {
        sign.compareAndSet(Thread.currentThread(), null);
    }

    public static void main(String[] args) {
        SpinLock spinLock=new SpinLock();
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+" 开始尝试获取自旋锁!");
                spinLock.lock();
                System.out.println(Thread.currentThread().getName()+" 获取到了自旋锁！");
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    System.out.println(Thread.currentThread().getName()+" 释放了自旋锁！");
                    spinLock.unlock();
                }
            }
        };

        new Thread(runnable,"线程1").start();
        new Thread(runnable,"线程2").start();

    }
}

/*
* 线程1 开始尝试获取自旋锁!
线程2 开始尝试获取自旋锁!
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
线程1 获取到了自旋锁！
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
......
......
......
......
线程2 自旋获取失败，再次尝试！
线程2 自旋获取失败，再次尝试！
线程1 释放了自旋锁！
线程2 自旋获取失败，再次尝试！
线程2 获取到了自旋锁！
线程2 释放了自旋锁！
* */